


import java.io.*;

import java.util.*;



public class CompteBancaire implements Serializable {

	private static final long serialVersionUID = -2062994542717559274L;

	private Titulaire m_titulaire;
	
	private long m_numero;
	
	private float m_solde;

	protected LinkedHashMap<Long, OperationBancaire> m_pOperation;
	
	private Banque m_banque;

	public CompteBancaire() {

		m_titulaire = new Titulaire();
		m_numero = 0;
		m_solde = 0;
		m_pOperation= new LinkedHashMap<Long, OperationBancaire>();
	}

	public CompteBancaire(final Banque b, Titulaire titulaire) throws IPException {

		if (titulaire == null)
			throw new IPException();
		m_titulaire = titulaire;
		m_numero = b.numeroRegistreCpt();
		m_solde = 0;
		m_pOperation = new LinkedHashMap<Long, OperationBancaire>();
		m_banque = b;

	}

	public String toString() {
		CompteBancaire op = new CompteBancaire();
		if(this.equals(op)) return "---";
		return "\n"+m_titulaire.toString() + "\n" + m_numero+" - "+m_solde;
	}

	public boolean equals(Object obj){
		if (obj == null) return false;
		if(((CompteBancaire)obj).m_titulaire.equals(m_titulaire) &&		// Titulaire identiques
			((CompteBancaire)obj).m_numero == m_numero &&				// Numero de compte identique
			((CompteBancaire)obj).m_solde == m_solde &&					// Solde du compte identique
			((CompteBancaire)obj).m_pOperation.equals(m_pOperation))	// Listing des operations identiques.
			{ return true; }
		return false;
	}

	public Titulaire getTitulaireCompte() {
		return m_titulaire;
	}

	public long getNumeroCompte() {
		return m_numero;
	}

	public float getSoldeCompte() {
		return m_solde;
	}

	public String getIdentiteTitulaire() {
		return m_titulaire.getNom() + " " + m_titulaire.getPrenom();
	}

	public String getAdresseTitulaire() {
		return m_titulaire.getAdresse();
	}

	public int  getNombreOperations() {
		return m_pOperation.size();
	}

	public String getDateDerniereOperation(){
		if(m_pOperation.size() == 0)
			return "0";
		
		long base = 0;
		
		for (long it : m_pOperation.keySet())
			if (it > base)
				base = it;
		
		return m_pOperation.get(base).getDate();

	}

	public void setAdresse(final String newAdresse) throws IPException {
		m_titulaire.setAdresse(newAdresse);
	}


	protected void add(float montant) throws IPException {
		if (montant < 0)
			throw new IPException("Somme incorrecte (negative)");
		m_solde += montant;
	}

	protected void sub(float montant) throws IPException, BUException {
		if (montant < 0)
			throw new IPException("retrait impossible : montant incorrect (negatif)");
		if (m_solde < montant)
			throw new BUException("retrait impossible : solde insuffisant");
		m_solde -= montant;
	}


	
}